home *** CD-ROM | disk | FTP | other *** search
Text File | 1998-04-30 | 8.6 KB | 390 lines | [TEXT/MPS ] |
- /*
- File: OTUdpCatchSample.cp
-
- Contains: UDP catch sample.
-
- Copyright: © 1993-1997 by Apple Computer, Inc., all rights reserved.
-
- */
-
-
- // OT UDP Catch Test Program (as an SIOW Tool)
-
- #include <QuickDraw.h>
- #include <stdio.h>
- #include <StdLib.h>
- #include <TextUtils.h>
- #include <strings.h>
- #include <String.h>
- #include <Events.h>
- #include <Windows.h>
- #include <Menus.h>
- #include <Devices.h>
- #include <Windows.h>
- #include <OpenTransport.h>
- #include <OpenTptInternet.h>
-
-
- /*******************************************************************************
- ** GLOBAL VARIABLES
- ********************************************************************************/
-
- #define kMaxDataLen 256
-
- InetPort gCatchPort=0;
- InetHost gCatchIpAddr=0;
- InetPort gPitchPort=0;
- InetHost gPitchIpAddr=0;
-
- UInt16 gBindCompleted = 0;
- UInt16 gDataToRead = 0;
- UInt8 data[kMaxDataLen];
-
- struct InetAddress reqsin, retsin, tmpsin;
-
- Boolean gFirstTime = true;
-
- /*******************************************************************************
- ** Function Prototypes
- ********************************************************************************/
-
- void Inits();
- void CleanUp();
- void Idle();
- void DoIt();
- OSStatus DoStaticBind(TEndpoint* ep);
- OSStatus DoReceive(TEndpoint* ep);
- Boolean UserAbort();
- OSStatus DoGetInterfaceInfo(SInt32 i);
-
-
- /*******************************************************************************
- ** main function
- ********************************************************************************/
-
- void main(int, char** )
- {
- char userInput[256];
-
- do
- {
- Inits();
- DoIt();
- CleanUp();
-
- fprintf(stderr, "Again (y/n)?\n");
- gets(&userInput[0]);
- } while ( userInput[0] == 'y' || userInput[0] == 'Y' );
-
- fprintf(stderr, "Bye\n");
- exit (0);
- }
-
- /*******************************************************************************
- ** Initialize Quickdraw and ASLM
- ********************************************************************************/
-
- void Inits()
- {
- if ( gFirstTime == true )
- {
- InitGraf(&qd.thePort);
- gFirstTime = false;
- }
-
- if ( InitOpenTransport() != kOTNoError )
- {
- fprintf(stderr, "OTUdpCatch: Could not initialize Open Transport, exiting\n");
- exit(1);
- }
- }
-
- /*******************************************************************************
- ** Clean up at the end
- ********************************************************************************/
-
- void CleanUp()
- {
- CloseOpenTransport();
- }
-
- /*******************************************************************************
- ** Idle
- ********************************************************************************/
-
- void Idle()
- {
- SystemTask();
- }
-
- /*******************************************************************************
- ** EventHandler
- ********************************************************************************/
-
- pascal void EventHandler(void*, OTEventCode event, OTResult, void*)
- {
- if (event == T_DATA)
- {
- gDataToRead = 1;
- return;
- }
- if (event == T_BINDCOMPLETE)
- {
- gBindCompleted = 1;
- return;
- }
- return;
- }
-
- /*******************************************************************************
- ** DoIt
- ********************************************************************************/
-
- void DoIt()
- {
- TEndpoint* ep = NULL;
- TEndpointInfo info;
- OSStatus err = kOTNoError;
- SInt32 myport = 0;
- UInt32 myaddr = 0;
- char mystr[255];
-
- fprintf(stderr, "What UDP port should I listen to ?\n");
- if ( gets(mystr) != 0 )
- {
- stringtonum(mystr, &myport);
- gCatchPort = (InetPort) myport;
- }
- fprintf(stderr, "The program will listen for packets on port <%d>\n", gCatchPort);
- fprintf(stderr, "until \'cmd .\' keys are pressed\n");
-
- OTInitInetAddress(&reqsin, gCatchPort, (InetHost) 0);
-
- do
- {
- //
- // Now create a UDP
- //
- ep = OTOpenEndpoint(OTCreateConfiguration(kUDPName), 0, &info, &err);
-
- if ( ep == NULL || err != kOTNoError )
- {
- ep = NULL;
- fprintf(stderr,"ERROR: OpenEndpoint(\"UDP\") failed with %d\n", err);
- break;
- }
- //
- // Install notifier we're going to use for testing
- //
- err = ep->InstallNotifier(&EventHandler, 0);
- if ( err != kOTNoError )
- {
- fprintf(stderr, "ERROR: InstallNotifier() failed with %d\n", err);
- break;
- }
- ep->SetSynchronous();
-
- //
- // Try to bind
- //
- ep->SetAsynchronous();
- err = DoStaticBind(ep);
- if ( err != kOTNoError )
- break;
-
- //
- // Display the interface info (IP address)
- //
- err = DoGetInterfaceInfo(0);
- if ( err != kOTNoError )
- break;
-
- ep->SetAsynchronous();
- do
- {
- //
- // Try to receive some data
- //
- if (gDataToRead == 1) {
- err = DoReceive(ep);
- if ( err != kOTNoError && err != kOTNoDataErr )
- break;
- }
- Idle();
- } while (!UserAbort());
- //
- // Try to Unbind
- //
- ep->SetSynchronous();
- err = ep->Unbind();
- if ( err != kOTNoError )
- {
- fprintf(stderr, "ERROR: Unbind() returned %d\n", err);
- break;
- }
- } while (false);
-
- if ( ep != NULL )
- {
- //
- // Remove notifier
- //
- ep->RemoveNotifier();
- //
- // Get rid of endpoint.
- //
- err = OTCloseProvider(ep);
- if ( err != kOTNoError )
- {
- fprintf(stderr, "ERROR: CloseEndpoint() failed with %d\n", err);
- }
- }
- }
-
- /*******************************************************************************
- ** DoStaticBind
- ********************************************************************************/
-
- OSStatus DoStaticBind(TEndpoint* ep)
- {
- TBind req, ret;
- OSStatus err;
-
- // bind udp to current address and port 2001
- req.addr.len = sizeof(struct InetAddress);
- req.addr.buf = (unsigned char *) &reqsin;
- req.qlen = 1; // don't care for udp
- ret.addr.maxlen = sizeof(struct InetAddress);
- ret.addr.buf = (unsigned char *) &retsin;
-
- err = ep->Bind(&req, &ret);
- if ( err != kOTNoError )
- {
- fprintf(stderr, "Static Bind returns %d\n", err);
- return err;
- }
- while (gBindCompleted == 0)
- {
- }
- gBindCompleted = 0;
- return err;
- }
-
- /*******************************************************************************
- ** DoReceive
- ********************************************************************************/
-
- OSStatus DoReceive(TEndpoint* ep)
- {
- OSStatus err = kOTNoError;
- TUnitData unitdata;
- OTFlags flags;
- char mystr[255];
-
- // Receive a UDP datagram
- gDataToRead = 0;
- while ( true )
- {
- unitdata.addr.maxlen = sizeof(struct InetAddress);
- unitdata.opt.maxlen = 0;
- unitdata.opt.buf = 0;
- unitdata.udata.maxlen = kMaxDataLen;
- unitdata.udata.buf = data;
- unitdata.addr.buf = (UInt8*) &tmpsin;
-
- err = ep->RcvUData( &unitdata, &flags);
- if ( err == kOTNoError )
- {
- OTInetHostToString(tmpsin.fHost, mystr);
- data[unitdata.udata.len] = '\0';
- fprintf(stderr, "Packet from <%s:%d> : size: <%d> data: \"%s\"\n", mystr,
- tmpsin.fPort, unitdata.udata.len, data);
- }
- else
- {
- if ( err != kOTNoDataErr )
- fprintf(stderr, "RcvUData returns %d\n", err);
- break;
- }
- };
- return err;
- }
-
- /*******************************************************************************
- ** IsPressed
- ********************************************************************************/
-
- Boolean IsPressed(UInt16 k, KeyMap map)
- {
- UInt8* keyMap = (UInt8*)map;
- return (keyMap[k >> 3] >> (k & 7) & 1);
- }
-
- /*******************************************************************************
- ** CmdKey
- ********************************************************************************/
-
- Boolean UserAbort()
- {
- KeyMap keyMap;
-
- GetKeys(keyMap);
- if ( IsPressed(0x37, keyMap) &&
- (IsPressed(0x2F, keyMap) || IsPressed(0x41, keyMap)) )
- {
- FlushEvents(everyEvent, 0); // needed so that "gets" gets not confused later on
- return true;
- }
- else
- {
- return false;
- }
- }
-
- /*******************************************************************************
- ** DoGetInterfaceInfo
- ********************************************************************************/
-
- OSStatus DoGetInterfaceInfo(SInt32 i)
- {
- OSStatus err;
- InetInterfaceInfo myInfo;
- union
- {
- InetHost addr;
- UInt8 bytes[4];
- } tmpAddr;
-
- do
- {
- memset(&myInfo, 0, sizeof(InetInterfaceInfo));
- err = OTInetGetInterfaceInfo(&myInfo, i);
- if (err != kOTNoError)
- {
- if (err == kOTNotFoundErr)
- {
- fprintf(stderr, "Interface %d: Does Not Exist\n", i);
- break;
- }
- else
- {
- fprintf(stderr, "Error! GetInterfaceInfo returns %d\n", err);
- break;
- }
- }
- tmpAddr.addr = myInfo.fAddress;
- fprintf(stderr, "Interface %d : Address = %d.%d.%d.%d\n ", i, tmpAddr.bytes[0],
- tmpAddr.bytes[1], tmpAddr.bytes[2], tmpAddr.bytes[3]);
- tmpAddr.addr = myInfo.fNetmask;
- fprintf(stderr, "Netmask = %d.%d.%d.%d\n ", tmpAddr.bytes[0],
- tmpAddr.bytes[1], tmpAddr.bytes[2], tmpAddr.bytes[3]);
- tmpAddr.addr = myInfo.fBroadcastAddr;
- fprintf(stderr, "Broadcast Address = %d.%d.%d.%d\n", tmpAddr.bytes[0],
- tmpAddr.bytes[1], tmpAddr.bytes[2], tmpAddr.bytes[3]);
- fprintf(stderr, "\n");
- } while ( false );
-
- return err;
- }
-
-